// nst_msg.h
#ifndef NST_MSG_H
#define NST_MSG_H

/**
 * @file nst_msg.h
 * @brief 通用消息队列框架，支持动态类型和零丢包
 */

 #include <stdint.h>
 #include <stdbool.h>
 
 // 队列配置（用户可修改）
 #define NST_MSG_MAX_QUEUES   8   // 系统支持的最大队列数量
 #define NST_MSG_NAME_LEN     16  // 队列名称最大长度
 
 typedef struct {
     char name[NST_MSG_NAME_LEN]; // 队列名称（如"UART1_TX"）
     uint8_t *buffer;             // 队列缓冲区指针
     uint16_t element_size;       // 单个元素大小（字节）
     uint16_t queue_size;         // 队列容量（元素个数）
     volatile uint16_t head;      // 队列头指针
     volatile uint16_t tail;      // 队列尾指针
 } nst_msg_queue_t;
 
 /**
  * @brief 初始化消息队列
  * @param queue 队列对象
  * @param name 队列名称（用于调试）
  * @param buffer 预分配的缓冲区指针
  * @param element_size 单个消息元素的大小（字节）
  * @param queue_size 队列容量（元素个数）
  */
 void nst_msg_init(
     nst_msg_queue_t *queue,
     const char *name,
     uint8_t *buffer,
     uint16_t element_size,
     uint16_t queue_size
 );
 
 /**
  * @brief 非阻塞入队（线程安全）
  * @return true 成功, false 队列已满
  */
 bool nst_msg_enqueue(nst_msg_queue_t *queue, const void *msg);
 
 /**
  * @brief 非阻塞出队（线程安全）
  * @return true 成功, false 队列为空
  */
 bool nst_msg_dequeue(nst_msg_queue_t *queue, void *msg);
 
 /**
  * @brief 检查队列是否为空
  */
 bool nst_msg_is_empty(const nst_msg_queue_t *queue);
 
 /**
  * @brief 检查队列是否已满
  */
 bool nst_msg_is_full(const nst_msg_queue_t *queue);
 
 /**
  * @brief 获取队列剩余空间（元素个数）
  */
 uint16_t nst_msg_remaining(const nst_msg_queue_t *queue);

#endif // NST_MSG_H
